/**
   $.utils,工具类
	{
		formSubmit，提交表单方法
		request:请求方法
		ajaxPost:ajaxPost方式
		ajaxGet：ajaxGet方式
	}
 */
(function($){
	    $.utils=$.utils||{};
		/**
		 * 描述：
		 *	  采用脚本自动提交表单
		 * 参数：
		 *     url：,
		 *     method: 支持get/post,
		 *     data: object类型,
		 * 返回值：没有返回值
		 * 创建人：李想
		 * 创建时间：2015-5-27
		 * 样例程序：
		 *     $.utils.formSubmit(
		 *				"http://sddd",
		 *				"get",
		 *				{name:123,age:'123213'});
		 */
		$.utils.formSubmit=function(url,method,data){
			//创建form表单元素
            $form=$('<form></form>').appendTo('body');
			
			//添加表单的请求地址（url），请求方式（method）
			$form.attr({action:url,method:method});
			
			//把data数据转换成form表单内的input隐藏域
			for(var i in data){
				$Ip=$('<input type="hidden" name='+i+' value='+data[i]+'>'); 
				$form.append($Ip);
			}
			//提交表单
			$form.submit(); 
		}
		
		/**
	     * ajax封装
	     * url 发送请求的地址
	     * data 发送到服务器的数据，数组存储，如：{"date": new Date().getTime(), "state": 1}
	     * async 默认值: true。默认设置下，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为 false。
	     *       注意，同步请求将锁住浏览器，用户其它操作必须等待请求完成才可以执行。
	     * type 请求方式("POST" 或 "GET")， 默认为 "GET"
	     * dataType 预期服务器返回的数据类型，常用的如：xml、html、json、text
	     * successfn 成功回调函数
	     * errorfn 失败回调函数
	     */
		$.utils.request=function(url, data, async, type, dataType, successfn, errorfn) {
	        async = (async==null || async=="" || typeof(async)=="undefined")? "true" : async;
	        type = (type==null || type=="" || typeof(type)=="undefined")? "post" : type;
	        dataType = (dataType==null || dataType=="" || typeof(dataType)=="undefined")? "json" : dataType;
	        data = (data==null || data=="" || typeof(data)=="undefined")? {"date": new Date().getTime()} : data;
	        $.ajax({
	            type: type,
	            async: async,
	            data: data,
	            url: url,
	            dataType: dataType,
	            success: function(d){
	            	if(typeof successfn =="function")
	            		 successfn(d);
	               
	            },
	            error: function(e){
	            	if(typeof errorfn =="function")
	            		errorfn(e);
	            }
	        });
	    };
	    /**
	     * ajax封装
	     * url 发送请求的地址
	     * data 发送到服务器的数据，数组存储，如：{"date": new Date().getTime(), "state": 1}
	     * successfn 成功回调函数
	     */
	    $.utils.ajaxPost=function(url, data,dataType, successfn) {
	        data = (data==null || data=="" || typeof(data)=="undefined")? {"date": new Date().getTime()} : data;
			dataType = (dataType==null || dataType=="" || typeof(dataType)=="undefined")? "json" : dataType;
	        $.ajax({
	            type: "post",
	            data: data,
	            url: url,
				dataType:dataType,
	            success: function(d){
	            	if(typeof successfn =="function")
	                successfn(d);
	            }
	        });
	    };
	    /**
	     * ajax封装
	     * url 发送请求的地址
	     * data 发送到服务器的数据，数组存储，如：{"date": new Date().getTime(), "state": 1}
	     * dataType 预期服务器返回的数据类型，常用的如：xml、html、json、text
	     * successfn 成功回调函数
	     * errorfn 失败回调函数
	     */
	    $.utils.ajaxGet=function(url, data, dataType,successfn, errorfn) {
	        data = (data==null || data=="" || typeof(data)=="undefined")? {"date": new Date().getTime()} : data;
			dataType = (dataType==null || dataType=="" || typeof(dataType)=="undefined")? "json" : dataType;
	        $.ajax({
	            type: "get",
	            data: data,
	            url: url,
				dataType:dataType,
	            success: function(d){
	            	if(typeof successfn =="function")
	                successfn(d);
	            },
	            error: function(e){
	            	if(typeof errorfn =="function")
	                errorfn(e);
	            }
	        });
	    };
		
})(jQuery);

/**
 * 表单管理工具工程。
 * 	创建者：liu.wd,创建时间:2015-5-27
 */
(function($){
	// 提取表单数据
	function getData(target,params){
		var queryParams = {};
		$(target).find('input').each(function(){
			if(this.name){
				var type = this.type, tag = this.tagName.toLowerCase();
				if (type == 'text' || type == 'hidden' || type == 'password'|| tag == 'textarea') {
					queryParams[this.name] = this.value;
				} else {
					if(type=='file'){
						var node=$(this);
						queryParams[this.name] = node.val();
					}else{
						if (type == 'checkbox') {
							if(this.checked){
								if(queryParams[this.name]){
									queryParams[this.name] = queryParams[this.name]+params.splitChar+this.value;
								}else{
									queryParams[this.name] = this.value;
								}
							}
						}else if(type == 'radio'){
							if(this.checked){
								queryParams[this.name] = this.value;
							}
						} else {
							if (tag == 'select') {
								queryParams[this.name] = [this.options(this.selectedIndex).value];
							}
						}
					}
				}
			}
			
		});
		//添加TextArea
		$(target).find('textarea').each(function(){
			queryParams[this.name] = this.value;
		});
		return queryParams;
	}
	
	// ajax 提交表单数据
	function ajaxForm(target,params){
		var data = getData(target,params);
		if(params.onBeforeSubmit.call(target,data)){
			$.utils.request(params.url,data,true,params.method,null,params.onSuccess,params.onError);
		}
		
	}
	
	/**
	 *	表单数据重置方法
	 */
	function res(target) {
		$(target).find('input').each(
				function() {
					if (this.type == 'text' || this.type == 'password'
							|| this.type == 'hidden') {
						this.value = '';
					} else {
						if (this.type == 'checkbox') {
							this.checked = '';
						} else {
							if (this.type == 'radio') {
								this.checked = '';
							}
						}
					}
		});
		$(target).find('select').each(function() {
			this.value="";
		});
		$(target).find('textarea').each(function() {
			this.value = '';
		});
	}
	
	function loadData(target,data){
		
	}
	
	
	/**
	 * 表单管理工具构造方法。
	 * 
	 */
	$.fn.formmanager=function(options,params){
		if(typeof options == "string"){
			return $.fn.formmanager.methods[options](this,params);
		}
	}
	
	/**
	 * 表单的属性信息。
	 */
	$.fn.formmanager.defaults={
		// 请求服务地址
		url:"",
		//请求方式：get/post,默认是post
		method:"post",
		// 多个数据拼装一起的分隔符
		splitChar:",",
		/* 表单提交 成功 返回数据。*/
		onSuccess:function(data){
		},
		// 请求失败的回调函数。
		onError:function(data){
		},
		// 提交表单之前的回调函数。
		onBeforeSubmit:function(data){
			return true;
		}
	}
	
	/**
	 * 表单工具的公有方法。
	 */
	$.fn.formmanager.methods={
			/**
			 * 表单提交的方法
			 * @param jq 表单jquery对象。
			 * 调用方式：
			 * 		$("#ss").formmanager('submit');
			 */
			submit:function(jq){
				$(target).submit();
			},
			/**
			 * 表单通过ajax的方式去提交。
			 * @param jq 表单jquery对象。
			 * @param params：参考 $.fn.formmanager.defaults对象
			 * 调用方式： 
			 	   $("#ss").formmanager("ajax",{
							 url:"",
							 onBeforeSubmit:function(data){
							    return true;
							 },
							 onSuccess:function(data){
							    // 判断data里边的数据是否保存成功！
							    // 跳转页面
							    $.utils.formSubmit("","get/post",{});
							 }
				   });
			 */
			ajax:function(jq,params){
				 var options = $.extend({},$.fn.formmanager.defaults,params);
				 ajaxForm(jq[0],options);
			},
			/**
			 * 获取表单数据
			 * @param jq 表单jquery对象
			 * @param params {splitChar:","}
			 * @returns 返回JSON格式 key：value.
			 * 调用方式：
			 * 		$("#ss").formmanager('getData'，{splitChar:","});
			 */
			getData:function(jq,params){
				var options = $.extend({},$.fn.formmanager.defaults,params);
			    return getData(jq,options);
			},
			
			/**
			 * 給表单加载数据
			 * @param jq
			 * @param params：数据对象JSON格式
			 * 调用方式：
			 * 	  $("#ss").formmanager('loadData'，{name:'123',age:age,birth:'2015-12-12'});
			 */
			loadData:function(jq,params){
				loadData(jq[0],params,$.fn.formmanager.defaults.splitChar);
			},
			/**
			 *	表单数据清空
			 *	@param jq表单jquery对象
			 *	@returns 没有返回值
			 *	调用方式:
			 *     $('ss').formmanager('reset');
			 */
			reset:function(jq){
               res(jq);
			}
	}
	
})(jQuery);
/**
 * 构建checkbox 和radio组件。
 * @param $
 */
(function ($) {
  /**
   * 根据目标dom取，checkbox，radio的value。
   * @param target  Dom
   * @returns {Array}
   */
  function getValue(target) {
    var dataArray = [];
    var state = $.data(target, 'ddparser');
    var items = state.options.items;
    for (var i = 0; i < items.length; i++) {
      if (items[i].checked) {
        dataArray.push($(items[i]).val());
      }
      ;
    }
    ;
    return dataArray;
  }

  /**
   * 根据目标dom设置，checkbox，radio的value。
   * @param target  目标Dom
   * @param data  设值数组
   * @returns {null}
   */
  function setValue(target, data) {
    var state = $.data(target, 'ddparser');
    var items = state.options.items;
    for (var i = 0; i < items.length; i++) {
      // $(items[i]).removeAttr('checked');
      if (typeof data == "string" || typeof data == "number") {
        if ($(items[i]).val() == data) {
          $(items[i]).attr('checked', 'checked');
        }
      } else {
        for (var j = 0; j < data.length; j++) {
          if ($(items[i]).val() == data[j]) {
            $(items[i]).attr('checked', 'checked');
          }
        }
      }
    };
  }
  
  function selectedAll(target){
	   var state = $.data(target, 'ddparser');
	    var items = state.options.items;
	    for (var i = 0; i < items.length; i++) {
	        $(items[i]).attr('checked', 'checked');
	    };
  }
  function clearAll(target){
	   var state = $.data(target, 'ddparser');
	    var items = state.options.items;
	    for (var i = 0; i < items.length; i++) {
	        $(items[i]).attr('checked',false);
	    };
 }
  
  

  function clearOtherChecked(target) {
    var state = $.data(target, 'ddparser');
    var items = state.options.items;
    for (var i = 0; i < items.length; i++) {
      $(items[i]).attr('checked', false);
    }
  }

  function clearRepulsionItemChecked(target) {
    var state = $.data(target, 'ddparser');
    var repulsionItem = state.options.repulsionItem;
    if (repulsionItem) {
      repulsionItem.attr('checked', false);
    }
  }

  function request(target, opts) {
    $(target).attr('comTagName', 'ddparser');
    create(target, opts.data);

  };
  function create(target, srcData) {
    var opts = $.data(target, 'ddparser').options;
    // 添加了数据过滤
    var data = opts.dataFilter(srcData);
    var sc = opts.splitChart || "";
    var isTextFirst = opts.isTextFirst;
    opts.items = [];
    //var repulsionItem;
    if (opts.repulsion && data[opts.repulsion]) {
    }
    var showNum = opts.showNum;
    var self = $(target);
    var _self = $("<table style='font-weight:bold;font-size:12px; line-height:28px;'></table>").appendTo(self);
    for (var i = 0; i < data.length; i++) {
    	var tr;
    	if (i % showNum == 0) {
    		tr =$("<tr></tr>").appendTo(_self);
        }
    	var td =$("<td></td>").appendTo(tr);
    	var _ipt = undefined;
        if (i != (opts.repulsion - 1)) {
          _ipt = $('<input vertical-align:middle;   row="'+i+'" tipID="' + target.id + '" class=' + opts.validateCls
            + ' validType=' + opts.validType + '  id="bmgroup-' +
            data[i][opts.valueField] + '" name="' + opts.name + '" value="' +
            data[i][opts.valueField] + '" type="' + opts.type + '" repulsion="false"/>').appendTo(td);
        } else {
          _ipt = $('<input  vertical-align:middle;  row="'+i+'" tipID="' + target.id + '" class=' + opts.validateCls
            + ' validType=' + opts.validType + '  id="bmgroup-' +
            data[i][opts.valueField] + '" name="' + opts.name + '" value="' +
            data[i][opts.valueField] + '" type="' + opts.type + '" repulsion="true"/>').appendTo(td);
        }
        td.append('&nbsp;');
        td.append(sc + opts.formatter(data[i],i) ||data[i][opts.textField]);
        
        if (opts.localClickName) {
          _ipt.attr('onClick', opts.localClickName + '(this)');
        }
        if (opts.unitkey) {
          _ipt.attr('unitkey', opts.unitkey);
        }
        if (opts.invalidMessage) {
          _ipt.attr('invalidMessage', opts.invalidMessage);
        }
        
      if (opts.disabled) {
        _ipt.attr('disabled', true);
      }
    }
    opts.items = $(_self).find("input[repulsion=false]");
    opts.repulsionItem = $(_self).find("input[repulsion=true]");
    opts.onLoadSuccess.call(target);
    bindEvent(target);
  };
  function bindEvent(target) {
    var state = $.data(target, 'ddparser');
    var repulsionItem = state.options.repulsionItem;
    var items = state.options.items;

    $(repulsionItem).bind('click', function (e) {
      state.options.onItemClick.call(repulsionItem, repulsionItem);
      if (state.options.type != 'radio') {
        clearOtherChecked(target);
      }
    });
    for (var i = 0; i < items.length; i++) {
      var item = items[i];
      $(item).bind('click', function (e) {
        state.options.onItemClick.call(this, this);
        if (state.options.type != 'radio') {
          clearRepulsionItemChecked(target);
        }
      });
    }
  };

  function reload(target, param) {
    target.innerHTML = "";
    if (typeof param.data == 'string') {
      data = $.global.getCacheObject().get(param.data);
    }
    if (param.onItemClick) {
      $.data(target, 'ddparser').options.onItemClick = param.onItemClick;
    } else {
      $.data(target, 'ddparser').options.onItemClick = function (itemNum, item) {
      };
    }

    create(target, data);
    return;
  }

  $.fn.ddparser = function (options, param) {
    if (typeof options == 'string') {
      var method = $.fn.ddparser.methods[options];
      if (method) {
        return method(this, param);
      }
    }
    options = options || {};
    return this.each(function () {
      var state = $.data(this, 'ddparser');
      if (state) {
        $.extend(state.options, options);
        request(this, state.options, {});
      } else {
        var state = $.data(this, 'ddparser', {
          options: $.extend({}, $.fn.ddparser.defaults,
            $.fn.ddparser.parseOptions(this),
            options)
        });
        request(this, state.options, {});
      }
    });
  };
  $.fn.ddparser.methods = {
    reload: function (jq, param) {
      return jq.each(function () {
        reload(this, param);
      });
    },
    attr: function (jq, param) {
      return jq.find('input').each(function () {
        for (var p in param) {
          if (p)
            $(this).attr(p, param[p]);
        }
      });
    },
    removeAttr: function (jq, param) {
      return jq.find('input').each(function () {
        $(this).removeAttr(param);
      });
    },
    disabled: function (jq, val) {
      var ipt = jq.find('input[value="' + val + '"]');
      ipt.attr('disabled', true);
    },
    disableAll: function (jq, val) {
      var ipt = jq.find('input');
      ipt.attr('disabled', true);
    },
    removeDisabled: function (jq, val) {
      var ipt = jq.find('input[value="' + val + '"]');
      ipt.removeAttr('disabled', true);
    },
    setValue: function (jq, param) {
      return setValue(jq[0], param);
    },
    getValue: function (jq) {
      return getValue(jq[0]);
    },
    selectedAll:function(jq){
    	selectedAll(jq[0]);
    },
    clearAll:function(jq){
    	clearAll(jq[0]);
    }
  };
  $.fn.ddparser.defaults = {
    // 一行展示的编码个数
    showNum: 6,
    // 缓存对象
    cacheObject: undefined,
    //input的类型 默认为checkbox
    type: 'checkbox',
    //指定数据中的第几项为排斥项
    repulsion: undefined,
    //指定分隔符
    splitChar: ',',
    textField: 'text',
    valueField: 'id',
    //指定选择框和文本描述的顺序，默认为文本在前。
    isTextFirst: true,
    // 是否禁用radio 或者 checkbox
    disabled: false,
    localClickName: '',
    // 验证样式
    validateCls: undefined,
    validType: undefined,
    unitkey: undefined,
    // 是否设置数据过滤为空。
    isFilterEmpty: false,
    // 过滤的code集合。
    filterCode: [],
    // 根据过滤条件，过滤数据。
    dataFilter: function (data) {
      var dataFilter = [];
      for (var j = 0, jlen = this.filterCode; j < jlen; j++) {
        var _tempKey = this.filterCode[j];
        for (var i = 0, len = data.length; i < len; i++) {
          if (_tempKey == data[i][this.valueField]) {
            dataFilter.push(data[i]);
          }
        }
      }
      if (this.isFilterEmpty) {
        dataFilter = [];
      }
      return dataFilter.length == 0 ? data : dataFilter;
    },
    onLoadError: function (error) {
    },
    onLoadSuccess: function () {
    },
    onItemClick: function (itemNum, item) {
    },
    formatter:function(row,i){
    }
  };
  $.fn.ddparser.parseOptions = function (target) {
    var t = $(target);
    return {
      name: t.attr('name'),
      type: t.attr('type'),
      method: t.attr('method'),
      //url:t.attr('url'),
      bmName: t.attr('bmName'),
      textField: t.attr('textField'),
      valueField: t.attr('valueField'),
      repulsion: t.attr('repulsion'),
      splitChart: t.attr('splitChart'),
      //queryParams:eval(t.attr('queryParams')),
      dataFilter: eval(t.attr('dataFilter')),
      validateCls: t.attr('validateCls'),
      validType: t.attr('validType')
    };
  };

})(jQuery);


